home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 20 / 5 / DISK2058.ZIP / UNFAST.EXE / MERR.F < prev    next >
Text File  |  1980-01-01  |  5KB  |  269 lines

  1. #inpend=0
  2. #include extinput.fi
  3. #short
  4. ext_inpend=0
  5. var z,y,lasty
  6.  
  7. print bios cr lf "Message files.ERR for FAST v2. By Peter Campbell." cr lf
  8. on error
  9.     {
  10.     pop ip
  11.     print bios:error msg "\dos.err":printh bios " (IP=";ip;")!"
  12.     stop
  13.     }
  14. ms=allocate 16384/16
  15.  
  16. print bios "File to edit/create: ";
  17. curtoloc
  18. l=ext_clean_input(name)
  19. if l=0 then error 999
  20.  
  21. #errors off
  22. open #1,name+2
  23. #errors on
  24. if error then create #1,name+2
  25.  
  26. file_len=read #1,16384 to ms|0
  27. close #1
  28. changed=0
  29.  
  30. cls:locate 0,0
  31. colour 15
  32. print "Makemsg file: ";:prints name+2,0:print "    Add    Enter  Delete  Print  ESCape"
  33. colour 7
  34. repeat 80 print "─";
  35. colour 15
  36. y=0
  37.  
  38. function confirm(text,def)
  39.     {
  40.     do_what:
  41.     escaped=0
  42.     open window confirmw
  43.     locate 20,10:prints text,0
  44.     print "? y/n [";chr('n'+def*11);"] ";
  45.     loctocur
  46.     wait for keypressed:ck=lcase key
  47.     close window
  48.     if ck=27 then escaped=1:return 0
  49.     if ck='n' then return 0
  50.     if ck=13 then return def
  51.     if ck='y' then return 1
  52.     goto do_what
  53.  
  54.     confirmw:
  55.     datab 0,0,6,18,40,22,15,26
  56.     }
  57.  
  58. proc abort
  59.     {
  60.     if changed then
  61.     {
  62.     if confirm(msave,1) then
  63.         {
  64.         create #1,name+2
  65.         write #1,file_len from ms|0
  66.         close #1
  67.         }
  68.     if escaped then return
  69.     }
  70.     cursor 24,0:print bios
  71.     stop
  72.  
  73.     msave: fname 'Save changes'
  74.     }
  75.  
  76. function item(nn)
  77.     {
  78.     m=0:c=0
  79.     while (c<=nn) and (m<file_len)
  80.     {
  81.     z=ms[m]b:m++
  82.     if z=0 then m+=2:c++
  83.     }
  84.     if m=file_len then return m
  85.     if c then return m-3 else return 0
  86.     }
  87.  
  88. function find_msg(nn)
  89.     {
  90.     y=0:m=0
  91.     while m<file_len
  92.     {
  93.     z=ms[m]b:m++
  94.     if z=0 then
  95.         {
  96.         num=ms[m]:m+=2
  97.         if num>=nn then return y
  98.         y++
  99.         }
  100.     }
  101.     return y
  102.     }
  103.  
  104. proc bar(r,c)
  105.     {
  106.     cursor r+2,8
  107.     m=(r+2)*160+1
  108.     repeat 80 video[m]b=c:m+=2
  109.     }
  110.  
  111. proc display
  112.     {
  113.     #long
  114.     if lasty<>((y/23)*23) then
  115.     {
  116.     #short
  117.     lasty=(y/23)*23
  118.     nn=item(lasty):ms[file_len]=0 ;Setup end character.
  119.  
  120.     for r=2 to 24
  121.         locate r,0
  122.         if nn=file_len then
  123.         {
  124.         fill 80*(25-r) from video|locpos with 0f20h
  125.         return
  126.         }
  127.         z=ms[nn]b:nn++
  128.         if z then z=printm whats_this,80
  129.         else
  130.         {
  131.         print "     ";:locpos-=10
  132.         print ms[nn] tab;
  133.         nn=(printm ms|nn+2,72)-1
  134.         if ms[nn]b=0ah then nn--
  135.         }
  136.     next r
  137.     }
  138.     }
  139.  
  140. proc delete_message
  141.     {
  142.     m1=item(y)
  143.     m2=item(y+1)
  144.     if m2=m1 then return
  145.     moveb file_len-m2 from ms|m2 to ms|m1
  146.     file_len-=m2-m1:changed=1
  147.     }
  148.  
  149. proc edit_message(new)
  150.     {
  151.     if not new then m1=item(y)
  152.  
  153.     me=m1+3
  154.     curtoloc
  155.     en=ms[m1+1]
  156.     ms[file_len]b=0
  157.     fillb 70 from message with ' '
  158.     mess=message
  159.     while ms[me]b pokeb mess,ms[me]b:me++:mess++
  160.  
  161.     edit_mess2:
  162.     len=ext_string(message,70)
  163.     if len then len--
  164.     if len then
  165.     {
  166.     m2=item(y+1)
  167.     moveb file_len-m2 from ms|m2 to ms|m1+len+3
  168.     moveb len from message to ms|m1+3
  169.     ms[m1]b=0:ms[m1+1]=en
  170.     file_len+=(m1+len+3)-m2
  171.     changed=1
  172.     }
  173.     }
  174.  
  175. proc add_message
  176.     {
  177.     open window add_number
  178.     cursor 18,61
  179.     en=input
  180.     close window
  181.     if en=0 then return
  182.  
  183.     y=find_msg(en):m1=item(y)
  184.     moveb file_len-m1 from ms|m1 to ms|m1+3
  185.     ms[m1]b=0:ms[m1+1]=en
  186.     file_len+=3
  187.  
  188.     lasty=-1
  189.     display
  190.     cursor (y mod 23)+2,8
  191.     edit_message(1)
  192.     }
  193.  
  194. update:
  195. lasty=-1
  196. msgs=item(32767):msgs=c
  197. locate 0,63:print msgs;" message(s). ";
  198.  
  199. forever
  200.     {
  201.     if y>=msgs then y=msgs-1
  202.     if y<0 then y=0
  203.     display
  204.     bar(y mod 23,120)
  205.     wait for keypressed
  206.     ks=keyscan:k=lcase low ks:s=high ks
  207.     bar(y mod 23,15)
  208.  
  209.     if s=71 then y=0
  210.     if s=72 then y--
  211.     if s=73 then y-=23
  212.     if s=79 then y=msgs-1
  213.     if s=80 then y++
  214.     if s=81 then y+=23
  215.  
  216.     if y>=msgs then y=msgs-1
  217.     if y<0 then y=0
  218.  
  219.     if k=27 then abort
  220.     #long
  221.     if msgs then
  222.     {
  223.     #short
  224.     if k='d' then
  225.         {
  226.         if confirm(mdel,0) then delete_message:goto update
  227.         }
  228.     if k=13 then edit_message(0):goto update
  229.     #long
  230.     if k='p' then
  231.         {
  232.     #short
  233.         lprint " Error Message File: ";
  234.         m=name+2:while peekb m lprint chr peek m;:m++
  235.         lprint cr lf
  236.  
  237.         m=0
  238.         while m<file_len
  239.         {
  240.         z=ms[m]b:m++
  241.         if z then lprint "????? ?"
  242.         else
  243.             {
  244.             lprint ms[m] chr 9;:m+=2
  245.             while ms[m]b lprint chr ms[m]b;:m++
  246.             lprint
  247.             }
  248.         }
  249.         }
  250.     }
  251.     if k='a' then add_message:goto update
  252.     }
  253.  
  254. name:
  255. string 30
  256.  
  257. message:
  258. space 70
  259.  
  260. mdel:
  261. fname 'Delete message'
  262.  
  263. whats_this:
  264. fname '*       *'
  265.  
  266. add_number:
  267. datab 0,0,45,16,70,20,120
  268. datab 22,2,2,'Error number:',1ah
  269.